/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.ulb.f203.projet.metier;

/**
 * DTO(Data Transfert Object) permettant de manipuler les résultats de
 * l'algorithme de Dijkstra.
 *
 * @author Srk
 */
public class DijkstraResult {

    private double[] dist;
    private Noeud[] prec;
    private Graphe graphe;

    /**
     * Crée un nouveau résultat de l'algorithme de Dijkstra.
     *
     * @param dist Les distances entre la racine et chacun des noeuds
     * @param prec Les noeuds précédents. Permet la construction d'un chemin.
     * @param graphe Graphe sur lequel l'algorithme est appliqué.
     */
    public DijkstraResult(double[] dist, Noeud[] prec, Graphe graphe) {
        this.dist = dist;
        this.prec = prec;
        this.graphe = graphe;
    }

    /**
     * Retourne le tableau de distances.
     *
     * @return Retourne le tableau de distances.
     */
    public double[] getDist() {
        return dist;
    }

    /**
     * Retourne le tableau des noeuds précédents.
     *
     * @return le tableau des noeuds précédents.
     */
    public Noeud[] getPrec() {
        return prec;
    }

    /**
     * Retourne le graphe sur lequel l'algorithme a été appliqué.
     *
     * @return
     */
    public Graphe getGraphe() {
        return graphe;
    }

    /**
     * Retourne un tableau de chaines représentant les chemins les plus courts
     * depuis la racine jusqu'aux noeuds.
     *
     * @return un tableau de chaines représentant les chemins les plus courts
     * depuis la racine jusqu'aux noeuds.
     */
    public String[] getResults() {
        Noeud s = graphe.getRacine();
        String[] result = new String[dist.length];
        for (int i = 0; i < dist.length; i++) {
            String chemin = "";

            chemin += " >> " + ((Noeud) graphe.getNoeuds().get(i)).getValue();
            int index = i;
            while (!prec[index].equals(s)) {
                chemin = " >> " + prec[index].getValue() + chemin;
                index = graphe.getNoeuds().indexOf(prec[index]);
            }
            chemin = "Distance Mininum de " + s.getValue() + " jusqu'à " + ((Noeud) graphe.getNoeuds().get(i)).getValue() + "\n" + s.getValue() + chemin + " : " + dist[i];
            result[i] = chemin;
        }
        return result;
    }

    public String getResultFor(Noeud noeud) {

        String chemin = "";

        Noeud s = graphe.getRacine();
        int index = graphe.getNoeuds().indexOf(noeud);
        chemin += " >> " + noeud.getValue();
        while (!prec[index].equals(s)) {
            chemin = " >> " + prec[index].getValue() + chemin;
            index = graphe.getNoeuds().indexOf(prec[index]);
        }
        chemin = s.getValue() + chemin + " : " + dist[graphe.getNoeuds().indexOf(noeud)];
        return chemin;

    }
}
